The main goal in this document in cover the very basics formatation for Rmarkdown, no matter if you are building a Html or pdf document. If you are new to Rmarkdown, please check the following reference for instalation guidance: https://bookdown.org/yihui/rmarkdown/installation.html

1 Text Formatation

1.1 Basic Formatation

a. Manual line Break

To add a line break, you can type two or more spaces in the end of the line, just like that:
this is a new line

b.Headers type

# Header 1
## Header 2
### Header 3

c.Text Emphasis

- Italic Format
- Bold Format
- Subscript1
- Superscript1

*Italic* or _italic_
**Bold** or __Bold__
Subscript~1~
Superscript^1^

1.2 Lists

a. Ordered list

1. First Element
2. Second Element
      + Nested Element
      + Another Nested Element

b. Unordered list

* Text 
* Another text
      + Nested text
- Other option for list
      + Again nested text

1.3 Page Break

To add a page break, as the example above, you can simply type four or more dashes or asteristics:

------ or 
******

1.4 Blockquotes

a. Plain Code Block

Since the beggining of this session I am using this option to show how to apply each of the formattings introduced up to now. With them it is possible to write some code in a fixed-width box, but not evaulating it:

      ```
      This text is displayed as it is **typed!** 
      ```

b. Blockquotes

Can be used to add some quotes in your markdown file, as in the following example.

“No medicine cures what happiness cannot”

Gabriel Garcia Marques
:)

> No medicine cures what happiness cannot  
> *Gabriel Garcia Marques*  
> :)

2 Output formats

There are several outputs formats available in Markdown:

Up to now, this tutorial have been focusing on markdown syntax in a more broadly way, But now, lets focus on some options for html_document output.
If you type ?rmarkdown::html_document in your R console, you can get a list of all options for HTML document. The ones that I use most are described below:

2.1 Usage examples:

Following you can find some usage examples of the mentioned options:

      html_document:
            code_folding: show
            toc: yes
            toc_depth: 1
            toc_float: yes
            code_download: yes
            highlight: haddock
            theme: lumen

2.2

Including section number:

output: 
      html_document:
            code_folding: show
            toc: yes
            toc_depth: 2
            toc_float: yes
            code_download: yes
            number_sections: true
            highlight: haddock
            theme: lumen




Flatly theme:



Journal theme:


Lumen theme:



3 Code

3.1 Echo Options

To insert some codes in the markdown document, the called code chunk, it is necessary to add three backticks like ´´´ followed by {r}, where r indicates the language name. To close the code chunk, add another three backticks in the end. You can write chunk options in the curly braces, as we are going to see in the following examples.

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Another easier way to add a R code chunk is simply type: “ctrl + alt + i”. It is possible to control the code output adding some chunk options inside the curly braces: {r }.
Following, some very useful options that I use very frequently:

  • eval: TRUE to evaluate the code chunk
  • echo: TRUE to show the code in the output document
  • results: If “hide” the text output will be hidden, “asis” for write a text as is.
  • collapse: TRUE to merge output text and the code into a single code block in the output.
  • Warning, message and error: Whether to show warnings, messages and error in the output document
  • include: When include = FALSE, the whole code chunk is excluded in the output, but note that it will still be evaluated if eval = TRUE.
  • cache: If caching is enabled, the same code chunk will not be evaluated the next time the document is compiled (if the code chunk was not modified), which can save you time.
  • fig.width and fig.height: The (graphical device) size of R plots in inches. Ex: fig.width = 6 and fig.height = 4 or fig.dim = c(6, 4).
  • out.width and out.height: The output size of R plots in the output document. These options may scale images. You can use percentages, e.g., out.width = ‘80%’ means 80% of the page width.
  • fig.align: The alignment of plots. It can be ‘left’, ‘center’, or ‘right’.
  • fig.cap: To include some figure caption.

For a better understanding of how these options work, we can see some examples below:

  1. {r, include = FALSE}
    • Code not shown
    • results not shown
  2. {r, echo = FALSE}
    • Code not shown
    • results shown
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
  1. {r, results = ‘hide’}
    • Code shown
    • Results not shown
summary(cars)
  1. {r, collapse=TRUE}
    • To merge the code and the output
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
  1. {r, out.width=‘30%’, fig.align=‘center’, fig.cap=‘Amazing Hong Kong’}
    • Another option for including images and captions.
knitr::include_graphics('C:/Users/gabriela.mourao/Documents/6-PESSOAL/timon-studler-49992-unsplash.jpg')
Amazing Hong Kong

Amazing Hong Kong

  1. {r, fig.align=‘center’, fig.width = 6, fig.height=4}
    • It is possible to adjust the graph size as well its alignment in the output document
ggplot(cars, aes(x=speed, y=dist)) +
      geom_point(alpha=1) + 
      labs(title = "Speed vs. Distance", x = "Speed", y = "Distance") + 
      theme_bw()

There are many options available for control the Code Chunk output, if you want more information about it in the following links you can find good references:
https://yihui.name/knitr/options/
https://bookdown.org/yihui/rmarkdown/r-code.html
https://www.overleaf.com/learn/latex/Positioning_images_and_tables

3.2 Inline Code

If one wants to add just a small code expression in the markdown text, it is necessary to add one backticks like in the example below:

For example:
- The total speed in Cars dataset is 770
- The total distance in Cars dataset is 2149


4 Formulas

4.1 Inline and display mode

If you are typing just a small formula, you might just want to add it in the line that you are typing. for example: “This is an inline example formula: \(E=mc^2\)

      "This is an inline example formula: $E=mc^2$"

But, if you are typing a very long expression, you might think that is better to use the display mode: \[a^n + b^n = (a - b)(a^{n-1} + a^{n-2}b + a^{n-3}b^2 + ... + ab^{n-2} + b^{n-1})\]

   $$a^n + b^n = (a - b)(a^{n-1} + a^{n-2}b + a^{n-3}b^2 + ... + ab^{n-2} + b^{n-1})$$

4.2 Symbols:

Some useful symbol formatations:

Symbol Latex Comment
\(\pm\) \pm plus or minus
\(\div\) \div divided by
\(\times\) \times times
\(\ge\) \ge greater or equal
\(\le\) \le less or equal
\(\forall\) \forall For all
\(\ne\) \ne Not equal
\(\sim\) \sim is similar to
\(\in\) \in is member of
\(\mathbb{R}\) \mathbb{R} Set of real numbers
\(\hat{y}\) \hat{y} y hat
\(\bar{y}\) \bar{y} y bar

4.3 Greek Letters

Symbol Latex Comment
\(\alpha\) \alpha alpha
\(\beta\) \beta beta
\(\Delta~and~\delta\) \Delta and \delta Delta
\(\epsilon~and~\varepsilon\) \epsilon and \varepsilon epsilon
\(\Gamma~and~\gamma\) \Gamma and \gamma Gamma
\(\pi\) \pi pi
\(\Sigma~\sigma~\varsigma\) \Sigma \sigma \varsigma Sigma

4.4 Index

\[ \begin{align} x_i, x_{i} && \text{(Subscript)}\\ x^2 && \text{(Superscript)}\\ x^2_i,~x^2_{i,j} && \text{(Combined)}\ \end{align} \]

x_i, x_{i} (Subscript)
x^2 (Superscript)
x^2_i, x^2_{i,j} (Combined)  

4.5 Expressions

4.5.1 Square roots

To indicate a square root, use \sqrt: \(\sqrt{x}\)

$\sqrt{x}$

4.5.2 Fractions

The fractions are displayed using \frac symbol:

\(x=\frac{1}{1+e^{\beta_0+\beta_{1}\times y}}\)

or adding a parantesis:

\(x=\left(\frac{1}{1+e^{\beta_0+\beta_{1}\times y}}\right)\)

$x=\frac{1}{1+e^{\beta_0+\beta_{1}\times y}}$   

$x=\left(\frac{1}{1+e^{\beta_0+\beta_{1}\times y}}\right)$

4.5.3 Summation expression

To add a summation sign, you can use \sum and combine it with the index syntax introduced above: \(\sum_{i=1}^n(y_i-\hat{y})^2\)

$\sum_{i=1}^n(y_i-\hat{y})^2$

4.5.4 Others

\[\int_0^{a} x^k~dx\]

$$\int_0^{a} x^k~dx$$

\[ \frac{\partial u}{\partial t} = h^2 \left( \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} + \frac{\partial^2 u}{\partial z^2} \right) \]

$$ \frac{\partial u}{\partial t}
   = h^2 \left( \frac{\partial^2 u}{\partial x^2}
      + \frac{\partial^2 u}{\partial y^2}
      + \frac{\partial^2 u}{\partial z^2} \right) $$

\[\lim_{x \to +\infty} \frac{3x^2 +7x^3}{x^2 +5x^4} = 3\]

$$\lim_{x \to +\infty} \frac{3x^2 +7x^3}{x^2 +5x^4} = 3$$

4.6 Matrices

\[\mathbf{X} = \left[\begin{array} {rrr} 2 & 4 & 6 \\ 8 & 10 & 12 \\ 14 & 16 & 18 \end{array}\right]\]

$$\mathbf{X} = \left[\begin{array}
{rrr}
2 & 4 & 6 \\
8 & 10 & 12 \\
14 & 16 & 18
\end{array}\right]$$

For operations with matrix you can also use \(\mathbf{y}=\mathbf{X}\beta\), for example.

$\mathbf{y}=\mathbf{X}\beta$

4.7 Alignment and comments:

You can use “~” to add some spaces in the formula: \[ x_{i} + y_{i} \ge 0 ~~~~~~~\forall~i \in \mathbb{R} \]

$$ x_{i} + y_{i} \ge 0 ~~~~~~~\forall~i \in \mathbb{R} $$

The formula inserted in “index” topic, wasn’t completely shown at that time. To write formulas together with comments, is necessary to use the following syntax:

$$
\begin{align}
x_i, x_{i} && \text{(Subscript)}\\
x^2 && \text{(Superscript)}\\
x^2_i,~x^2_{i,j} && \text{(Combined)}\  
\end{align}
$$

Besides that, when solving large expressions, might be useful to use some alignment:

\[\begin{align} 5\times a~+~10 &=30 \\ 5\times a &= 20 \\ a &= 4 \end{align}\]

$$\begin
      5\times a~+~10 &=30 \\
      5\times a &= 20 \\
      a &= 4
\end$$

6 Images

For images, the syntax is very similar to links:

The amazing Hong Kong1


![The amazing Hong Kong](C:/Users/gabriela.mourao/Documents/6-PESSOAL/timon-studler-49992-unsplash.jpg)^[photo by timon studler on unsplash]  


7 Tables

Inserting manual tables in Rmarkdown is very easy:

Number Section Section Name
1.0 Text Formatation
2.0 Output formats
3.0 Code options
4.0 Formulas
5.0 Links
6.0 Images
7.0 Tables
|Number Section|Section Name|
|:---:|:---:|
|1.0|Text Formatation|
|2.0|Output formats|
|3.0|Code options|
|4.0|Formulas|
|5.0|Links|
|6.0|Images|
|7.0|Tables|

8 References

Following are the references used in this tutorial. They are very complete and useful, I sugest that you check it for more informations about Rmarkdown.

https://bookdown.org/yihui/rmarkdown/ https://oeis.org/wiki/List_of_LaTeX_mathematical_symbols http://www.math.mcgill.ca/yyang/regression/RMarkdown/example.html https://gist.github.com/derekmcloughlin/896da22518ef2f3d81b0 https://www.maths.tcd.ie/~dwilkins/LaTeXPrimer/Calculus.html

I hope you found this tutorial helpful! Cheers! :)


  1. photo by timon studler on unsplash

LS0tDQp0aXRsZTogIlJNYXJrZG93bjogSW50cm9kdWN0b3J5IFR1dG9yaWFsIg0KYXV0aG9yOiAiR2FicmllbGEgTW91cuNvIg0KZGF0ZTogIjI3IGRlIG5vdmVtYnJvIGRlIDIwMTgiDQpvdXRwdXQ6IA0KICAgICAgaHRtbF9kb2N1bWVudDoNCiAgICAgICAgICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgICAgICAgICAgdG9jOiB5ZXMNCiAgICAgICAgICAgIHRvY19kZXB0aDogMg0KICAgICAgICAgICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgY3NzOiBCZWF1dGlmdWxSLmNzcw0KLS0tDQoNCjxpbWcgc3JjPSJSbG9nby5zdmciIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDt0b3A6MTBweDtsZWZ0OjUwcHg7IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE0MCIvPg0KDQo8c3R5bGU+DQogYTp2aXNpdGVkIHsNCiAgICBjb2xvcjogT3JhbmdlOw0KfQ0KDQogYTpob3ZlciB7DQogICAgY29sb3I6IE9yYW5nZTsNCn0NCjwvc3R5bGU+DQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQojYXV0b21hdGljYWxseSBmb3JtYXQgdGhlIFIgY29kZQ0KbGlicmFyeShmb3JtYXRSKQ0KYGBgDQo8YnI+DQpUaGUgbWFpbiBnb2FsIGluIHRoaXMgZG9jdW1lbnQgaW4gY292ZXIgdGhlIHZlcnkgYmFzaWNzIGZvcm1hdGF0aW9uIGZvciBSbWFya2Rvd24sIG5vIG1hdHRlciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgSHRtbCBvciBwZGYgZG9jdW1lbnQuDQpJZiB5b3UgYXJlIG5ldyB0byBSbWFya2Rvd24sIHBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIHJlZmVyZW5jZSBmb3IgaW5zdGFsYXRpb24gZ3VpZGFuY2U6DQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vaW5zdGFsbGF0aW9uLmh0bWwNCjxicj4NCg0KIyBUZXh0IEZvcm1hdGF0aW9uIA0KDQojIyBCYXNpYyBGb3JtYXRhdGlvbiAgIA0KKiphLiBNYW51YWwgbGluZSBCcmVhayoqICAgDQoNClRvIGFkZCBhIGxpbmUgYnJlYWssIHlvdSBjYW4gdHlwZSB0d28gb3IgbW9yZSBzcGFjZXMgaW4gdGhlIGVuZCBvZiB0aGUgbGluZSwganVzdCBsaWtlIHRoYXQ6ICAgDQoqdGhpcyBpcyBhIG5ldyBsaW5lKiAgIA0KDQoqKmIuSGVhZGVycyB0eXBlKioNCg0KYGBgDQojIEhlYWRlciAxDQojIyBIZWFkZXIgMg0KIyMjIEhlYWRlciAzDQoNCmBgYA0KKipjLlRleHQgRW1waGFzaXMqKiAgIA0KICAgDQoqLSBJdGFsaWMgRm9ybWF0KiAgIA0KKiotIEJvbGQgRm9ybWF0KiogICANCi0gU3Vic2NyaXB0fjF+ICAgICANCi0gU3VwZXJzY3JpcHReMV4NCg0KDQpgYGANCipJdGFsaWMqIG9yIF9pdGFsaWNfDQoqKkJvbGQqKiBvciBfX0JvbGRfXw0KU3Vic2NyaXB0fjF+DQpTdXBlcnNjcmlwdF4xXg0KYGBgDQogDQoNCiMjIExpc3RzDQoNCioqYS4gT3JkZXJlZCBsaXN0KiogICANCg0KDQpgYGANCjEuIEZpcnN0IEVsZW1lbnQNCjIuIFNlY29uZCBFbGVtZW50DQogICAgICArIE5lc3RlZCBFbGVtZW50DQogICAgICArIEFub3RoZXIgTmVzdGVkIEVsZW1lbnQNCmBgYA0KKipiLiBVbm9yZGVyZWQgbGlzdCoqICANCg0KDQpgYGANCiogVGV4dCANCiogQW5vdGhlciB0ZXh0DQogICAgICArIE5lc3RlZCB0ZXh0DQotIE90aGVyIG9wdGlvbiBmb3IgbGlzdA0KICAgICAgKyBBZ2FpbiBuZXN0ZWQgdGV4dA0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFBhZ2UgQnJlYWsNCg0KVG8gYWRkIGEgcGFnZSBicmVhaywgYXMgdGhlIGV4YW1wbGUgYWJvdmUsIHlvdSBjYW4gc2ltcGx5IHR5cGUgZm91ciBvciBtb3JlIGRhc2hlcyBvciBhc3RlcmlzdGljczoNCg0KYGBgDQotLS0tLS0gb3IgDQoqKioqKioNCg0KYGBgDQojIyBCbG9ja3F1b3Rlcw0KDQoqKmEuIFBsYWluIENvZGUgQmxvY2sgKioNCg0KU2luY2UgdGhlIGJlZ2dpbmluZyBvZiB0aGlzIHNlc3Npb24gSSBhbSB1c2luZyB0aGlzIG9wdGlvbiB0byBzaG93IGhvdyB0byBhcHBseSBlYWNoIG9mIHRoZSBmb3JtYXR0aW5ncyBpbnRyb2R1Y2VkIHVwIHRvIG5vdy4gV2l0aCB0aGVtIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHNvbWUgY29kZSBpbiBhIGZpeGVkLXdpZHRoIGJveCwgIGJ1dCBub3QgZXZhdWxhdGluZyBpdDoNCg0KYGBgDQogICAgICBgYGANCiAgICAgIFRoaXMgdGV4dCBpcyBkaXNwbGF5ZWQgYXMgaXQgaXMgKip0eXBlZCEqKiANCiAgICAgIGBgYA0KYGBgDQoqKmIuIEJsb2NrcXVvdGVzKiogIA0KDQpDYW4gYmUgdXNlZCB0byBhZGQgc29tZSBxdW90ZXMgaW4geW91ciBtYXJrZG93biBmaWxlLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuICANCg0KPiAiTm8gbWVkaWNpbmUgY3VyZXMgd2hhdCBoYXBwaW5lc3MgY2Fubm90IiAgIA0KPiAgIA0KPiAqR2FicmllbCBHYXJjaWEgTWFycXVlcyogICANCj4gOikgICANCg0KYGBgDQo+IE5vIG1lZGljaW5lIGN1cmVzIHdoYXQgaGFwcGluZXNzIGNhbm5vdCAgDQo+ICpHYWJyaWVsIEdhcmNpYSBNYXJxdWVzKiAgDQo+IDopDQoNCmBgYA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgT3V0cHV0IGZvcm1hdHMgICANCg0KVGhlcmUgYXJlIHNldmVyYWwgb3V0cHV0cyBmb3JtYXRzIGF2YWlsYWJsZSBpbiBNYXJrZG93bjogIA0KDQoqIGJlYW1lcl9wcmVzZW50YXRpb24gIA0KKiBnaXRodWJfZG9jdW1lbnQgICAgICAgDQoqIGh0bWxfZG9jdW1lbnQgICANCiogaW9zbGlkZXNfcHJlc2VudGF0aW9uICAgDQoqIGxhdGV4X2RvY3VtZW50ICAgDQoqIG1kX2RvY3VtZW50ICAgDQoqIG9kdF9kb2N1bWVudCAgIA0KKiBwZGZfZG9jdW1lbnQgICANCiogcG93ZXJwb2ludF9wcmVzZW50YXRpb24gICANCiogcnRmX2RvY3VtZW50ICAgDQoqIHNsaWR5X3ByZXNlbnRhdGlvbiAgIA0KKiB3b3JkX2RvY3VtZW50ICAgDQoNClVwIHRvIG5vdywgdGhpcyB0dXRvcmlhbCBoYXZlIGJlZW4gZm9jdXNpbmcgb24gbWFya2Rvd24gc3ludGF4IGluIGEgbW9yZSBicm9hZGx5IHdheSwgQnV0IG5vdywgbGV0cyBmb2N1cyBvbiBzb21lIG9wdGlvbnMgZm9yICoqaHRtbF9kb2N1bWVudCoqIG91dHB1dC4gICAgDQpJZiB5b3UgdHlwZSA/cm1hcmtkb3duOjpodG1sX2RvY3VtZW50IGluIHlvdXIgUiBjb25zb2xlLCB5b3UgY2FuIGdldCBhIGxpc3Qgb2YgYWxsIG9wdGlvbnMgZm9yIEhUTUwgZG9jdW1lbnQuIFRoZSBvbmVzIHRoYXQgSSB1c2UgbW9zdCBhcmUgZGVzY3JpYmVkIGJlbG93OiAgIA0KDQotICoqY29kZV9mb2xkaW5nOioqIEVuYWJsZSBkb2N1bWVudCByZWFkZXJzIHRvIHRvZ2dsZSB0aGUgZGlzcGxheSBvZiBSIGNvZGUgY2h1bmtzLiBTcGVjaWZ5ICJub25lIiB0byBkaXNwbGF5IGFsbCBjb2RlIGNodW5rcyAoYXNzdW1pbmcgdGhleSB3ZXJlIGtuaXQgd2l0aCBlY2hvID0gVFJVRSkuIFNwZWNpZnkgImhpZGUiIHRvIGhpZGUgYWxsIFIgY29kZSBjaHVua3MgYnkgZGVmYXVsdCAodXNlcnMgY2FuIHNob3cgaGlkZGVuIGNvZGUgY2h1bmtzIGVpdGhlciBpbmRpdmlkdWFsbHkgb3IgZG9jdW1lbnQtd2lkZSkuIFNwZWNpZnkgInNob3ciIHRvIHNob3cgYWxsIFIgY29kZSBjaHVua3MgYnkgZGVmYXVsdC4gICANCi0gKip0b2M6KiogdG8gaW5jbHVkZSBhIHRhYmxlIG9mIGNvbnRlbnRzIGluIHRoZSBvdXRwdXQgICAgIA0KLSAqKnRvY19kZXB0aDoqKiBEZXB0aCBvZiBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGFibGUgZm9ybWF0ICAgIA0KLSAqKnRvY19mbG9hdDoqKiBUUlVFIHRvIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyAgICAgIA0KLSAqKkNvZGVfZG93bmxvYWQ6KiogRW1iZWRlZCB0aGUgUm1kIHNvdXJjZSBjb2RlIHdpdGhpbiB0aGUgZG9jdW1lbnQgYW5kIHByb3ZpZGUgYSBsaW5rIHRoYXQgY2FuIGJlIHVzZWQgYnkgcmVhZGVycyB0byBkb3dubG9hZCB0aGUgY29kZS4gICANCi0gKipudW1iZXJfc2VjdGlvbnM6KiogVFJVRSB0byBudW1iZXIgc2VjdGlvbiBoZWFkaW5ncw0KLSAqKnNlbGZfY29udGVhaW5lZDoqKiBQcm9kdWNlIGEgc3RhbmRhbG9uZSBIVE1MIGZpbGUgd2l0aCBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuDQoNCiMjIFVzYWdlIGV4YW1wbGVzOg0KDQpGb2xsb3dpbmcgeW91IGNhbiBmaW5kIHNvbWUgdXNhZ2UgZXhhbXBsZXMgb2YgdGhlIG1lbnRpb25lZCBvcHRpb25zOg0KDQpgYGANCiAgICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICAgICAgICAgIHRvYzogeWVzDQogICAgICAgICAgICB0b2NfZGVwdGg6IDENCiAgICAgICAgICAgIHRvY19mbG9hdDogeWVzDQogICAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgdGhlbWU6IGx1bWVuDQpgYGANCg0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vb3V0cHV0MS5wbmcpIA0KDQo8YnI+DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICANCg0KSW5jbHVkaW5nIHNlY3Rpb24gbnVtYmVyOiAgIA0KDQpgYGANCm91dHB1dDogDQogICAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICAgICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgICAgICAgICB0b2M6IHllcw0KICAgICAgICAgICAgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICB0b2NfZmxvYXQ6IHllcw0KICAgICAgICAgICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgdGhlbWU6IGx1bWVuDQoNCmBgYA0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vb3V0cHV0Mi5wbmcpICAgDQoNCjxicj4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCkZsYXRseSB0aGVtZTogICANCg0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vZmxhdGx5LnBuZykNCg0KPGJyPiAgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICANCg0KSm91cm5hbCB0aGVtZTogICANCiFbXShDOi9Vc2Vycy9nYWJyaWVsYS5tb3VyYW8vRG9jdW1lbnRzLzYtUEVTU09BTC9SLWZpbGVzL1RVVE9SSUFMX01BUktET1dOL2pvdXJuYWxfYW5kX2hhZGRvY2sucG5nKQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgDQoNCkx1bWVuIHRoZW1lOiAgIA0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vbHVtZW4ucG5nKQ0KDQo8YnI+DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIA0KDQojIENvZGUNCg0KIyMgRWNobyBPcHRpb25zDQoNClRvIGluc2VydCBzb21lIGNvZGVzIGluIHRoZSBtYXJrZG93biBkb2N1bWVudCwgdGhlIGNhbGxlZCBjb2RlIGNodW5rLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIHRocmVlIGJhY2t0aWNrcyBsaWtlILS0tCBmb2xsb3dlZCBieSB7cn0sIHdoZXJlIHIgaW5kaWNhdGVzIHRoZSBsYW5ndWFnZSBuYW1lLiBUbyBjbG9zZSB0aGUgY29kZSBjaHVuaywgYWRkIGFub3RoZXIgdGhyZWUgYmFja3RpY2tzIGluIHRoZSBlbmQuIFlvdSBjYW4gd3JpdGUgY2h1bmsgb3B0aW9ucyBpbiB0aGUgY3VybHkgYnJhY2VzLCBhcyB3ZSBhcmUgZ29pbmcgdG8gc2VlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuICAgICANCg0KYGBge3J9DQpzdW1tYXJ5KGNhcnMpDQpgYGANCg0KQW5vdGhlciBlYXNpZXIgd2F5IHRvIGFkZCBhIFIgY29kZSBjaHVuayBpcyBzaW1wbHkgdHlwZTogImN0cmwgKyBhbHQgKyBpIi4gSXQgaXMgcG9zc2libGUgdG8gY29udHJvbCB0aGUgY29kZSBvdXRwdXQgYWRkaW5nIHNvbWUgY2h1bmsgb3B0aW9ucyBpbnNpZGUgdGhlIGN1cmx5IGJyYWNlczoge3IgfS4gICANCkZvbGxvd2luZywgc29tZSB2ZXJ5IHVzZWZ1bCBvcHRpb25zIHRoYXQgSSB1c2UgdmVyeSBmcmVxdWVudGx5OiAgIA0KDQotICoqZXZhbDoqKiBUUlVFIHRvIGV2YWx1YXRlIHRoZSBjb2RlIGNodW5rICANCi0gKiplY2hvOioqIFRSVUUgdG8gc2hvdyB0aGUgY29kZSBpbiB0aGUgb3V0cHV0IGRvY3VtZW50ICAgDQotICoqcmVzdWx0czoqKiBJZiAiaGlkZSIgdGhlIHRleHQgb3V0cHV0IHdpbGwgYmUgaGlkZGVuLCAiYXNpcyIgZm9yIHdyaXRlIGEgdGV4dCBhcyBpcy4gICAgDQotICoqY29sbGFwc2U6KiogVFJVRSB0byBtZXJnZSBvdXRwdXQgdGV4dCBhbmQgdGhlIGNvZGUgaW50byBhIHNpbmdsZSBjb2RlIGJsb2NrIGluIHRoZSBvdXRwdXQuICAgDQotICoqV2FybmluZywgbWVzc2FnZSBhbmQgZXJyb3I6KiogV2hldGhlciB0byBzaG93IHdhcm5pbmdzLCBtZXNzYWdlcyBhbmQgZXJyb3IgaW4gdGhlIG91dHB1dCBkb2N1bWVudCANCi0gKippbmNsdWRlOioqIFdoZW4gaW5jbHVkZSA9IEZBTFNFLCB0aGUgd2hvbGUgY29kZSBjaHVuayBpcyBleGNsdWRlZCBpbiB0aGUgb3V0cHV0LCBidXQgbm90ZSB0aGF0IGl0IHdpbGwgc3RpbGwgYmUgZXZhbHVhdGVkIGlmIGV2YWwgPSBUUlVFLiAgIA0KLSAqKmNhY2hlOioqIElmIGNhY2hpbmcgaXMgZW5hYmxlZCwgdGhlIHNhbWUgY29kZSBjaHVuayB3aWxsIG5vdCBiZSBldmFsdWF0ZWQgdGhlIG5leHQgdGltZSB0aGUgZG9jdW1lbnQgaXMgY29tcGlsZWQgKGlmIHRoZSBjb2RlIGNodW5rIHdhcyBub3QgbW9kaWZpZWQpLCB3aGljaCBjYW4gc2F2ZSB5b3UgdGltZS4gICANCi0gKipmaWcud2lkdGggYW5kIGZpZy5oZWlnaHQ6KiogVGhlIChncmFwaGljYWwgZGV2aWNlKSBzaXplIG9mIFIgcGxvdHMgaW4gaW5jaGVzLiBFeDogZmlnLndpZHRoID0gNiBhbmQgZmlnLmhlaWdodCA9IDQgb3IgZmlnLmRpbSA9IGMoNiwgNCkuICANCi0gKipvdXQud2lkdGggYW5kIG91dC5oZWlnaHQ6KiogVGhlIG91dHB1dCBzaXplIG9mIFIgcGxvdHMgaW4gdGhlIG91dHB1dCBkb2N1bWVudC4gVGhlc2Ugb3B0aW9ucyBtYXkgc2NhbGUgaW1hZ2VzLiBZb3UgY2FuIHVzZSBwZXJjZW50YWdlcywgZS5nLiwgb3V0LndpZHRoID0gJzgwJScgbWVhbnMgODAlIG9mIHRoZSBwYWdlIHdpZHRoLiAgIA0KLSAqKmZpZy5hbGlnbjoqKiBUaGUgYWxpZ25tZW50IG9mIHBsb3RzLiBJdCBjYW4gYmUgJ2xlZnQnLCAnY2VudGVyJywgb3IgJ3JpZ2h0Jy4gIA0KLSAqKmZpZy5jYXA6ICoqIFRvIGluY2x1ZGUgc29tZSBmaWd1cmUgY2FwdGlvbi4NCg0KRm9yIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZXNlIG9wdGlvbnMgd29yaywgd2UgY2FuIHNlZSBzb21lIGV4YW1wbGVzIGJlbG93OiAgIA0KDQoxLiAqKntyLCBpbmNsdWRlID0gRkFMU0V9KiogICANCiAgICAgICsgQ29kZSBub3Qgc2hvd24gICANCiAgICAgICsgcmVzdWx0cyBub3Qgc2hvd24gICANCjIuICoqe3IsIGVjaG8gPSBGQUxTRX0qKiAgIA0KICAgICAgKyBDb2RlIG5vdCBzaG93bg0KICAgICAgKyByZXN1bHRzIHNob3duICAgDQpgYGB7ciwgZWNobz1GQUxTRX0NCnN1bW1hcnkoY2FycykNCmBgYA0KDQoNCjMuICoqe3IsIHJlc3VsdHMgPSAnaGlkZSd9KiogICANCiAgICAgICsgQ29kZSBzaG93biAgIA0KICAgICAgKyBSZXN1bHRzIG5vdCBzaG93biAgIA0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0Kc3VtbWFyeShjYXJzKQ0KYGBgDQoNCg0KNC4gKip7ciwgY29sbGFwc2U9VFJVRX0qKiAgIA0KICAgICAgKyBUbyBtZXJnZSB0aGUgY29kZSBhbmQgdGhlIG91dHB1dCAgIA0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQpzdW1tYXJ5KGNhcnMpDQoNCmBgYA0KDQoNCjUuICoqe3IsIG91dC53aWR0aD0nMzAlJywgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwPSdBbWF6aW5nIEhvbmcgS29uZyd9KiogICANCiAgICAgICsgQW5vdGhlciBvcHRpb24gZm9yIGluY2x1ZGluZyBpbWFnZXMgYW5kIGNhcHRpb25zLiANCg0KDQpgYGB7ciwgb3V0LndpZHRoPSczMCUnLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9J0FtYXppbmcgSG9uZyBLb25nJ30NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ0M6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML3RpbW9uLXN0dWRsZXItNDk5OTItdW5zcGxhc2guanBnJykNCg0KYGBgDQoNCg0KDQo2LiAqKntyLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQ9NH0qKiAgIA0KICAgICAgKyBJdCBpcyBwb3NzaWJsZSB0byBhZGp1c3QgdGhlIGdyYXBoIHNpemUgYXMgd2VsbCBpdHMgYWxpZ25tZW50IGluIHRoZSBvdXRwdXQgZG9jdW1lbnQNCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodD00fQ0KDQpnZ3Bsb3QoY2FycywgYWVzKHg9c3BlZWQsIHk9ZGlzdCkpICsNCiAgICAgIGdlb21fcG9pbnQoYWxwaGE9MSkgKyANCiAgICAgIGxhYnModGl0bGUgPSAiU3BlZWQgdnMuIERpc3RhbmNlIiwgeCA9ICJTcGVlZCIsIHkgPSAiRGlzdGFuY2UiKSArIA0KICAgICAgdGhlbWVfYncoKQ0KDQoNCmBgYA0KDQogICANClRoZXJlIGFyZSBtYW55IG9wdGlvbnMgYXZhaWxhYmxlIGZvciBjb250cm9sIHRoZSBDb2RlIENodW5rIG91dHB1dCwgaWYgeW91IHdhbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdCBpbiB0aGUgZm9sbG93aW5nIGxpbmtzIHlvdSBjYW4gZmluZCBnb29kIHJlZmVyZW5jZXM6ICAgDQpodHRwczovL3lpaHVpLm5hbWUva25pdHIvb3B0aW9ucy8gICANCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9yLWNvZGUuaHRtbCAgIA0KaHR0cHM6Ly93d3cub3ZlcmxlYWYuY29tL2xlYXJuL2xhdGV4L1Bvc2l0aW9uaW5nX2ltYWdlc19hbmRfdGFibGVzDQoNCg0KDQojIyBJbmxpbmUgQ29kZSAgDQoNCklmIG9uZSB3YW50cyB0byBhZGQganVzdCBhIHNtYWxsIGNvZGUgZXhwcmVzc2lvbiBpbiB0aGUgbWFya2Rvd24gdGV4dCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBvbmUgYmFja3RpY2tzIGxpa2UgaW4gdGhlIGV4YW1wbGUgYmVsb3c6ICAgDQogICAgICANCkZvciBleGFtcGxlOiAgIA0KLSBUaGUgdG90YWwgc3BlZWQgaW4gQ2FycyBkYXRhc2V0IGlzIGByIHN1bShjYXJzJHNwZWVkKWAgICANCi0gVGhlIHRvdGFsIGRpc3RhbmNlIGluIENhcnMgZGF0YXNldCBpcyBgciBzdW0oY2FycyRkaXN0KWANCg0KDQohW10oQzovVXNlcnMvZ2FicmllbGEubW91cmFvL0RvY3VtZW50cy82LVBFU1NPQUwvUi1maWxlcy9UVVRPUklBTF9NQVJLRE9XTi9JbmxpbmVfY29kZS5wbmcpDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEZvcm11bGFzICAgIA0KDQojIyBJbmxpbmUgYW5kIGRpc3BsYXkgbW9kZQ0KDQpJZiB5b3UgYXJlIHR5cGluZyBqdXN0IGEgc21hbGwgZm9ybXVsYSwgeW91IG1pZ2h0IGp1c3Qgd2FudCB0byBhZGQgaXQgaW4gdGhlIGxpbmUgdGhhdCB5b3UgYXJlIHR5cGluZy4gZm9yIGV4YW1wbGU6ICJUaGlzIGlzIGFuIGlubGluZSBleGFtcGxlIGZvcm11bGE6ICRFPW1jXjIkIg0KDQpgYGANCiAgICAgICJUaGlzIGlzIGFuIGlubGluZSBleGFtcGxlIGZvcm11bGE6ICRFPW1jXjIkIg0KDQpgYGANCg0KQnV0LCBpZiB5b3UgYXJlIHR5cGluZyBhIHZlcnkgbG9uZyBleHByZXNzaW9uLCB5b3UgbWlnaHQgdGhpbmsgdGhhdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBkaXNwbGF5IG1vZGU6ICQkYV5uICsgYl5uID0gKGEgLSBiKShhXntuLTF9ICsgYV57bi0yfWIgKyBhXntuLTN9Yl4yICsgLi4uICsgYWJee24tMn0gKyBiXntuLTF9KSQkDQoNCmBgYA0KICAgJCRhXm4gKyBiXm4gPSAoYSAtIGIpKGFee24tMX0gKyBhXntuLTJ9YiArIGFee24tM31iXjIgKyAuLi4gKyBhYl57bi0yfSArIGJee24tMX0pJCQNCg0KYGBgDQoNCiMjIFN5bWJvbHM6DQoNClNvbWUgdXNlZnVsIHN5bWJvbCBmb3JtYXRhdGlvbnM6DQoNCnxTeW1ib2x8IExhdGV4IHwgQ29tbWVudA0KfDotLS06fDotLS06fDotLS06fA0KfCRccG0kfCBgXHBtYCB8IHBsdXMgb3IgbWludXN8DQp8JFxkaXYkfGBcZGl2YHwgZGl2aWRlZCBieXwNCnwkXHRpbWVzJHxgXHRpbWVzYHx0aW1lc3wNCnwkXGdlJHwgYFxnZWAgfCBncmVhdGVyIG9yIGVxdWFsfA0KfCRcbGUkfCBgXGxlYCB8IGxlc3Mgb3IgZXF1YWwgfA0KfCRcZm9yYWxsJHwgYFxmb3JhbGxgfCBGb3IgYWxsfA0KfCRcbmUkfCBgXG5lYHwgTm90IGVxdWFsfA0KfCRcc2ltJHwgYFxzaW1gfCBpcyBzaW1pbGFyIHRvfA0KfCRcaW4kfCBgXGluYHwgaXMgbWVtYmVyIG9mfA0KfCRcbWF0aGJie1J9JHwgYFxtYXRoYmJ7Un1gIHwgU2V0IG9mIHJlYWwgbnVtYmVyc3wNCnwkXGhhdHt5fSR8YFxoYXR7eX1gfCB5IGhhdHwNCnwkXGJhcnt5fSR8YFxiYXJ7eX1gfCB5IGJhcnwNCg0KIyMgR3JlZWsgTGV0dGVycyAgDQoNCnxTeW1ib2x8IExhdGV4IHwgQ29tbWVudA0KfDotLS06fDotLS06fDotLS06fA0KfCRcYWxwaGEkfCBgXGFscGhhYCB8IGFscGhhfA0KfCRcYmV0YSR8YFxiZXRhYHwgYmV0YXwNCnwkXERlbHRhfmFuZH5cZGVsdGEkfGBcRGVsdGEgYW5kIFxkZWx0YWB8RGVsdGF8DQp8JFxlcHNpbG9ufmFuZH5cdmFyZXBzaWxvbiR8IGBcZXBzaWxvbiBhbmQgXHZhcmVwc2lsb25gIHwgZXBzaWxvbnwNCnwkXEdhbW1hfmFuZH5cZ2FtbWEkfCBgXEdhbW1hIGFuZCBcZ2FtbWFgIHxHYW1tYXwNCnwkXHBpJHwgYFxwaWB8IHBpfA0KfCRcU2lnbWF+XHNpZ21hflx2YXJzaWdtYSR8IGBcU2lnbWEgXHNpZ21hIFx2YXJzaWdtYWB8IFNpZ21hfA0KDQojIyBJbmRleA0KDQokJA0KXGJlZ2lue2FsaWdufQ0KeF9pLCB4X3tpfSAmJiBcdGV4dHsoU3Vic2NyaXB0KX1cXA0KeF4yICYmIFx0ZXh0eyhTdXBlcnNjcmlwdCl9XFwNCnheMl9pLH54XjJfe2ksan0gJiYgXHRleHR7KENvbWJpbmVkKX1cICANClxlbmR7YWxpZ259DQokJA0KDQpgYGANCnhfaSwgeF97aX0gKFN1YnNjcmlwdCkNCnheMiAoU3VwZXJzY3JpcHQpDQp4XjJfaSwgeF4yX3tpLGp9IChDb21iaW5lZCkgIA0KDQpgYGANCg0KIyMgRXhwcmVzc2lvbnMNCg0KIyMjIFNxdWFyZSByb290cw0KVG8gaW5kaWNhdGUgYSBzcXVhcmUgcm9vdCwgdXNlIGBcc3FydGA6ICRcc3FydHt4fSQNCg0KYGBgDQokXHNxcnR7eH0kDQoNCmBgYA0KDQojIyMgRnJhY3Rpb25zDQpUaGUgZnJhY3Rpb25zIGFyZSBkaXNwbGF5ZWQgdXNpbmcgYFxmcmFjYCBzeW1ib2w6PGJyPiAgDQokeD1cZnJhY3sxfXsxK2Vee1xiZXRhXzArXGJldGFfezF9XHRpbWVzIHl9fSQ8YnI+ICAgDQpvciBhZGRpbmcgYSBwYXJhbnRlc2lzOjxicj4gICANCiR4PVxsZWZ0KFxmcmFjezF9ezErZV57XGJldGFfMCtcYmV0YV97MX1cdGltZXMgeX19XHJpZ2h0KSQ8YnI+DQoNCmBgYA0KJHg9XGZyYWN7MX17MStlXntcYmV0YV8wK1xiZXRhX3sxfVx0aW1lcyB5fX0kICAgDQoNCiR4PVxsZWZ0KFxmcmFjezF9ezErZV57XGJldGFfMCtcYmV0YV97MX1cdGltZXMgeX19XHJpZ2h0KSQNCg0KYGBgDQojIyMgU3VtbWF0aW9uIGV4cHJlc3Npb24NClRvIGFkZCBhIHN1bW1hdGlvbiBzaWduLCB5b3UgY2FuIHVzZSBgXHN1bWAgYW5kIGNvbWJpbmUgaXQgd2l0aCB0aGUgaW5kZXggc3ludGF4IGludHJvZHVjZWQgYWJvdmU6DQokXHN1bV97aT0xfV5uKHlfaS1caGF0e3l9KV4yJA0KDQpgYGANCiRcc3VtX3tpPTF9Xm4oeV9pLVxoYXR7eX0pXjIkDQoNCmBgYA0KDQojIyMgT3RoZXJzDQokJFxpbnRfMF57YX0geF5rfmR4JCQNCg0KYGBgIA0KJCRcaW50XzBee2F9IHhea35keCQkDQoNCmBgYA0KDQokJCBcZnJhY3tccGFydGlhbCB1fXtccGFydGlhbCB0fQ0KICAgPSBoXjIgXGxlZnQoIFxmcmFje1xwYXJ0aWFsXjIgdX17XHBhcnRpYWwgeF4yfQ0KICAgICAgKyBcZnJhY3tccGFydGlhbF4yIHV9e1xwYXJ0aWFsIHleMn0NCiAgICAgICsgXGZyYWN7XHBhcnRpYWxeMiB1fXtccGFydGlhbCB6XjJ9IFxyaWdodCkgJCQgIA0KDQoNCmBgYA0KJCQgXGZyYWN7XHBhcnRpYWwgdX17XHBhcnRpYWwgdH0NCiAgID0gaF4yIFxsZWZ0KCBcZnJhY3tccGFydGlhbF4yIHV9e1xwYXJ0aWFsIHheMn0NCiAgICAgICsgXGZyYWN7XHBhcnRpYWxeMiB1fXtccGFydGlhbCB5XjJ9DQogICAgICArIFxmcmFje1xwYXJ0aWFsXjIgdX17XHBhcnRpYWwgel4yfSBccmlnaHQpICQkDQpgYGANCg0KJCRcbGltX3t4IFx0byArXGluZnR5fSBcZnJhY3szeF4yICs3eF4zfXt4XjIgKzV4XjR9ID0gMyQkDQoNCmBgYA0KJCRcbGltX3t4IFx0byArXGluZnR5fSBcZnJhY3szeF4yICs3eF4zfXt4XjIgKzV4XjR9ID0gMyQkDQpgYGANCg0KDQojIyBNYXRyaWNlcw0KDQokJFxtYXRoYmZ7WH0gPSBcbGVmdFtcYmVnaW57YXJyYXl9DQp7cnJyfQ0KMiAmIDQgJiA2IFxcDQo4ICYgMTAgJiAxMiBcXA0KMTQgJiAxNiAmIDE4DQpcZW5ke2FycmF5fVxyaWdodF0kJA0KDQpgYGANCiQkXG1hdGhiZntYfSA9IFxsZWZ0W1xiZWdpbnthcnJheX0NCntycnJ9DQoyICYgNCAmIDYgXFwNCjggJiAxMCAmIDEyIFxcDQoxNCAmIDE2ICYgMTgNClxlbmR7YXJyYXl9XHJpZ2h0XSQkDQoNCmBgYA0KRm9yIG9wZXJhdGlvbnMgd2l0aCBtYXRyaXggeW91IGNhbiBhbHNvIHVzZSAkXG1hdGhiZnt5fT1cbWF0aGJme1h9XGJldGEkLCBmb3IgZXhhbXBsZS4NCg0KYGBgDQokXG1hdGhiZnt5fT1cbWF0aGJme1h9XGJldGEkDQoNCmBgYA0KDQojIyBBbGlnbm1lbnQgYW5kIGNvbW1lbnRzOg0KDQpZb3UgY2FuIHVzZSAifiIgdG8gYWRkIHNvbWUgc3BhY2VzIGluIHRoZSBmb3JtdWxhOg0KJCQgeF97aX0gKyB5X3tpfSBcZ2UgMCB+fn5+fn5+XGZvcmFsbH5pIFxpbiBcbWF0aGJie1J9ICQkDQpgYGANCiQkIHhfe2l9ICsgeV97aX0gXGdlIDAgfn5+fn5+flxmb3JhbGx+aSBcaW4gXG1hdGhiYntSfSAkJA0KDQpgYGANClRoZSBmb3JtdWxhIGluc2VydGVkIGluICJpbmRleCIgdG9waWMsIHdhc24ndCBjb21wbGV0ZWx5IHNob3duIGF0IHRoYXQgdGltZS4gVG8gd3JpdGUgZm9ybXVsYXMgdG9nZXRoZXIgd2l0aCBjb21tZW50cywgaXMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoNCg0KYGBgDQokJA0KXGJlZ2lue2FsaWdufQ0KeF9pLCB4X3tpfSAmJiBcdGV4dHsoU3Vic2NyaXB0KX1cXA0KeF4yICYmIFx0ZXh0eyhTdXBlcnNjcmlwdCl9XFwNCnheMl9pLH54XjJfe2ksan0gJiYgXHRleHR7KENvbWJpbmVkKX1cICANClxlbmR7YWxpZ259DQokJA0KDQpgYGANCkJlc2lkZXMgdGhhdCwgd2hlbiBzb2x2aW5nIGxhcmdlIGV4cHJlc3Npb25zLCBtaWdodCBiZSB1c2VmdWwgdG8gdXNlIHNvbWUgYWxpZ25tZW50Og0KDQokJFxiZWdpbnthbGlnbn0NCiAgICAgIDVcdGltZXMgYX4rfjEwICY9MzAgXFwNCiAgICAgIDVcdGltZXMgYSAmPSAyMCBcXA0KICAgICAgYSAmPSA0DQpcZW5ke2FsaWdufSQkDQoNCmBgYA0KJCRcYmVnaW4NCiAgICAgIDVcdGltZXMgYX4rfjEwICY9MzAgXFwNCiAgICAgIDVcdGltZXMgYSAmPSAyMCBcXA0KICAgICAgYSAmPSA0DQpcZW5kJCQNCg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIExpbmtzICAgDQoNClRvIGluc2VydCBoeXBlcmxpbmtzLCB5b3UgY2FuIHR5cGU6IFtSLXN0dWRpb10oaHR0cHM6Ly93d3cucnN0dWRpby5jb20pIG9yIGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tICAgDQoNCg0KYGBgDQoNCltSLXN0dWRpb10oaHR0cHM6Ly93d3cucnN0dWRpby5jb20pICAgICAgDQpvciAgICAgDQpodHRwczovL3d3dy5yc3R1ZGlvLmNvbSAgIA0KDQoNCmBgYA0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEltYWdlcyAgIA0KDQpGb3IgaW1hZ2VzLCB0aGUgc3ludGF4IGlzIHZlcnkgc2ltaWxhciB0byBsaW5rczogICANCg0KIVtUaGUgYW1hemluZyBIb25nIEtvbmddKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML3RpbW9uLXN0dWRsZXItNDk5OTItdW5zcGxhc2guanBnKV5bcGhvdG8gYnkgdGltb24gc3R1ZGxlciBvbiB1bnNwbGFzaF0NCg0KYGBgDQoNCiFbVGhlIGFtYXppbmcgSG9uZyBLb25nXShDOi9Vc2Vycy9nYWJyaWVsYS5tb3VyYW8vRG9jdW1lbnRzLzYtUEVTU09BTC90aW1vbi1zdHVkbGVyLTQ5OTkyLXVuc3BsYXNoLmpwZyleW3Bob3RvIGJ5IHRpbW9uIHN0dWRsZXIgb24gdW5zcGxhc2hdICANCg0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgVGFibGVzICAgICAgDQoNCkluc2VydGluZyBtYW51YWwgdGFibGVzIGluIFJtYXJrZG93biBpcyB2ZXJ5IGVhc3k6DQoNCnxOdW1iZXIgU2VjdGlvbnxTZWN0aW9uIE5hbWV8DQp8Oi0tLTp8Oi0tLTp8DQp8MS4wfFRleHQgRm9ybWF0YXRpb258DQp8Mi4wfE91dHB1dCBmb3JtYXRzfA0KfDMuMHxDb2RlIG9wdGlvbnN8DQp8NC4wfEZvcm11bGFzfA0KfDUuMHxMaW5rc3wNCnw2LjB8SW1hZ2VzfA0KfDcuMHxUYWJsZXN8DQoNCg0KDQpgYGANCnxOdW1iZXIgU2VjdGlvbnxTZWN0aW9uIE5hbWV8DQp8Oi0tLTp8Oi0tLTp8DQp8MS4wfFRleHQgRm9ybWF0YXRpb258DQp8Mi4wfE91dHB1dCBmb3JtYXRzfA0KfDMuMHxDb2RlIG9wdGlvbnN8DQp8NC4wfEZvcm11bGFzfA0KfDUuMHxMaW5rc3wNCnw2LjB8SW1hZ2VzfA0KfDcuMHxUYWJsZXN8DQoNCmBgYA0KDQojIFJlZmVyZW5jZXMNCg0KRm9sbG93aW5nIGFyZSB0aGUgcmVmZXJlbmNlcyB1c2VkIGluIHRoaXMgdHV0b3JpYWwuIFRoZXkgYXJlIHZlcnkgY29tcGxldGUgYW5kIHVzZWZ1bCwgSSBzdWdlc3QgdGhhdCB5b3UgY2hlY2sgaXQgZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0IFJtYXJrZG93bi4NCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLw0KaHR0cHM6Ly9vZWlzLm9yZy93aWtpL0xpc3Rfb2ZfTGFUZVhfbWF0aGVtYXRpY2FsX3N5bWJvbHMNCmh0dHA6Ly93d3cubWF0aC5tY2dpbGwuY2EveXlhbmcvcmVncmVzc2lvbi9STWFya2Rvd24vZXhhbXBsZS5odG1sDQpodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kZXJla21jbG91Z2hsaW4vODk2ZGEyMjUxOGVmMmYzZDgxYjANCmh0dHBzOi8vd3d3Lm1hdGhzLnRjZC5pZS9+ZHdpbGtpbnMvTGFUZVhQcmltZXIvQ2FsY3VsdXMuaHRtbCAgIA0KICAgDQogICANCioqSSBob3BlIHlvdSBmb3VuZCB0aGlzIHR1dG9yaWFsIGhlbHBmdWwhIENoZWVycyEgOikqKg0KDQo=